package com.example.zlpermissionservice.controller.inner;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.zlpermissionservice.api.ResourceApi;
import com.example.zlpermissionservice.common.base.ResponseResult;
import com.example.zlpermissionservice.common.constant.CommonConstant;
import com.example.zlpermissionservice.common.exception.NumProcessing;
import com.example.zlpermissionservice.dto.request.ResourceReqDTO;
import com.example.zlpermissionservice.dto.response.MenuResDTO;
import com.example.zlpermissionservice.dto.response.ResourceResDTO;
import com.example.zlpermissionservice.dto.response.TreeItemResDTO;
import com.example.zlpermissionservice.dto.response.TreeResDTO;
import com.example.zlpermissionservice.entity.Resource;
import com.example.zlpermissionservice.service.IResourceService;
import com.example.zlpermissionservice.service.impl.ResourceServiceImpl;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author zhenliu（孙凌岳）
 * @Description 内部接口 - 资源信息控制器（供用户服务 RPC 调用）
 * @Date 2025/6/16 8:57
 * @Version 1.0
 */
@Slf4j
@Api(tags = "内部接口 - 资源信息控制器", hidden = true)
@RestController
@RequestMapping("/permission/inner/resource")
public class InnerResourceController implements ResourceApi {
    @javax.annotation.Resource
    private IResourceService resourceService;

    /**
     * 删除资源
     * @param menuId
     * @return
     */
    @Override
    @DeleteMapping("/{menuId}")
    @ApiOperation(value = "根据资源 ID 删除（内部 RPC）", notes = "根据资源 ID 删除资源项")
    public Boolean remove(@PathVariable("menuId") String menuId) {
        return resourceService.deleteMenuById(menuId);
    }

    /**
     * 修改资源
     * @param resourceReqDTO
     * @return
     */
    @Override
    @PutMapping("/update")
    @ApiOperation(value = "修改资源信息（内部 RPC）", notes = "根据传入的 DTO 修改资源")
    public Boolean updateResource(@RequestBody ResourceReqDTO resourceReqDTO) {
        return resourceService.updateResource(resourceReqDTO);
    }

    /**
     * 获取树形结构资源
     * @param resourceReqDTO
     * @return
     */
    @Override
    @PostMapping("/tree")
    @ApiOperation(value = "查询资源树结构（内部 RPC）", notes = "返回资源树结构")
    public TreeResDTO resourceTreeResDTO(@RequestBody ResourceReqDTO resourceReqDTO) {
        return resourceService.resourceTreeVo(resourceReqDTO);
    }

    /**
     * 多条件查询资源列表
     * @param resourceReqDTO
     * @return
     */
    @Override
    @PostMapping("/list")
    @ApiOperation(value = "多条件查询资源列表（内部 RPC）", notes = "返回资源列表")
    public List<ResourceResDTO> findResourceList(@RequestBody ResourceReqDTO resourceReqDTO) {
        return resourceService.findResourceList(resourceReqDTO);
    }

    /**
     * rpc-根据角色id获取角色对应资源
     * @param userId 角色id
     * @return
     */
    @Override
    @GetMapping("/find-resource")
    @ApiOperation(value = "根据用户 ID 查询资源（内部 RPC）", notes = "用于 RPC 获取用户所拥有的资源")
    public List<ResourceResDTO> findResourceResDTOListByUserId(Long userId) {
        return resourceService.findResourceResDTOListByUserId(userId);
    }


    /**
     * 顶部菜单列表
     * @param userId
     * @return
     */
    @Override
    @GetMapping("/menus")
    @ApiOperation(value = "获取顶部菜单列表（内部 RPC）", notes = "返回顶部导航菜单")
    public List<MenuResDTO> menus(Long userId) {
        List<MenuResDTO> menus = resourceService.menus(userId);
        return menus;
    }

    /**
     * 按钮列表
     * @return
     */
    @GetMapping("/buttons")
    @ApiOperation(value = "获取按钮权限列表（内部 RPC）", notes = "返回用户按钮权限列表")
    public List<MenuResDTO> buttons(Long userId) {
        List<MenuResDTO> menus = resourceService.buttons(userId);
        return menus;
    }
}
